package com.qingzhu.service.impl;

import com.qingzhu.dao.GoodsDao;
import com.qingzhu.dao.ItemDao;
import com.qingzhu.dao.impl.GoodsDaoImpl;
import com.qingzhu.dao.impl.ItemDaoImpl;
import com.qingzhu.pojo.*;
import com.qingzhu.service.ShopOptionService;

import java.util.ArrayList;
import java.util.List;

public class ShopOptionServiceImpl implements ShopOptionService {
    ItemDao itemDao = new ItemDaoImpl();
    GoodsDao goodsDao = new GoodsDaoImpl();
    Boolean updateShopOption;     // 是否需要修改商品列表
    Boolean updateItemOption;     // 是否需要在数量上做添加
    int shopOptionCheckedNum;     // 选中的购物选项的数量
    int itemCheckedNum;           // 选中的商品的数量

    @Override
    public ShopOption createdOption(int shopNum, int itemId) {
        // 查询商品的所有信息
        Item item = itemDao.findById(itemId,true);
        Goods goods = goodsDao.findGoodsById(item.getGoodsId(),true);
        // 封装商品的信息
        ItemOption itemOption = new ItemOption();
        itemOption.setItem(item);
        itemOption.setShopNum(shopNum);
        itemOption.setSellPoint(goods.getSellPoint());
        List<ItemOption> items = new ArrayList<>();
        items.add(itemOption);
        // 创建购物选项
        ShopOption shopOption = new ShopOption();
        shopOption.setOptionName(goods.getGoodsName());
        shopOption.setItems(items);
        return shopOption;
    }

    @Override
    public ShopCart addShopSption(ShopCart shopCart, int shopNum, int itemId) {
        // 参数初始化
        updateShopOption = false;
        updateItemOption = false;
        List<ShopOption> shopOptions = shopCart.getShopOptions();
        Item item = itemDao.findById(itemId,true);
        Goods goods = goodsDao.findGoodsById(item.getGoodsId(),true);
        // 将原购物车中的购物选项拷贝出来
        List<ShopOption> copyShopOptions = new ArrayList<>();
        shopOptions.forEach(s -> {
            // 如果添加的购物选项不在购物车中就直接拷贝，否则就在原购物选项的基础上修改选项列表
            if (s != null && s.getOptionName().equals(goods.getGoodsName())){
                updateShopOption = true;
                // 将原有的商品选项拷贝到一个新的商品集合
                List<ItemOption> newItems = new ArrayList<>();
                s.getItems().forEach(i -> {
                    Item shopItem = i.getItem();
                    // 如果添加的商品规格不在购物车的商品列表中则直接拷贝商品，否则就在原有的商品数量上做添加
                    if (shopItem.getId() == itemId) {
                        updateItemOption = true;
                        Integer num = Integer.parseInt(String.valueOf(i.getShopNum()));
                        i.setShopNum(num+shopNum);
                        // 如果商品处于选中状态需要重新计算总价格
                        if (i.getIsChecked()) {
                            double addSunPrice = shopNum*i.getItem().getPrice();
                            shopCart.setSunShopPrice(shopCart.getSunShopPrice()+addSunPrice);
                        }
                        newItems.add(i);
                    }else {
                        newItems.add(i);
                    }
                });
                // 如果没有在数量上做添加就创建一个新的商品添加
                if (!updateItemOption) {
                    ItemOption itemOption = new ItemOption();
                    itemOption.setItem(item);
                    itemOption.setShopNum(shopNum);
                    itemOption.setSellPoint(goods.getSellPoint());
                    newItems.add(itemOption);
                    // 同时将购物选项的复选框和全选状态全都设置为false
                    s.setIsChecked(false);
                    shopCart.setIsChecked(false);
                }
                s.setItems(newItems);
                copyShopOptions.add(s);
            }else if (s != null) {
                copyShopOptions.add(s);
            }
        });
        // 如果没有修改商品列表就创建一个新的购物选项添加到购物车
        if (!updateShopOption) {
            ShopOption shopOption = createdOption(shopNum, itemId);
            copyShopOptions.add(shopOption);
            // 将全选状态设置为false
            shopCart.setIsChecked(false);
        }
        shopCart.setShopOptions(copyShopOptions);
        return shopCart;
    }

    @Override
    public ShopCart removeShopSption(ShopCart shopCart, int itemId) {
        // 获取购物选项列表/SPU和SKU
        List<ShopOption> shopOptions = shopCart.getShopOptions();
        Item item = itemDao.findById(itemId,true);
        Goods goods = goodsDao.findGoodsById(item.getGoodsId(),true);
        // 拷贝原购物车中的购物选项
        List<ShopOption> copyShopOptions = new ArrayList<>();
        shopOptions.forEach(s -> {
            // 拷贝原有的商品选项中的商品列表
            List<ItemOption> newItems = new ArrayList<>();
            s.getItems().forEach(i -> {
                Item shopItem = i.getItem();
                // 如果此时的商品规格和需要删除的商品规格是同一个商品，则不拷贝并在总数量上减1；否则直接拷贝
                if (shopItem.getId() == itemId) {
                    System.out.println("即将移除的商品选项："+i);
                    shopCart.setItemTotal(shopCart.getItemTotal() - 1);
                    // 如果是被选中的状态还需要在总金额和选中数量上减少相应的金额和数量
                    if (i.getIsChecked()) {
                        double sunShopPrice = shopCart.getSunShopPrice() - i.getShopNum()*i.getItem().getPrice();
                        shopCart.setSunShopPrice(sunShopPrice);
                        int checkedNum = shopCart.getCheckedNum() - 1;
                        shopCart.setCheckedNum(checkedNum);
                    }
                }else {
                    newItems.add(i);
                }
            });
            // 如果此时的商品集合不是空的，则将商品集合拷贝到购物选项中并把购物选项拷贝到购物车；否则不处理
            if (newItems.size() != 0) {
                s.setItems(newItems);
                copyShopOptions.add(s);
            }
        });
        // 将处理后的购物车选项替换到购物车中
        shopCart.setShopOptions(copyShopOptions);
        return shopCart;
    }

    @Override
    public ShopCart removeShopSption(ShopCart shopCart, List<Integer> itemIds) {
        for (int i=0; i<itemIds.size(); i++) {
            shopCart = removeShopSption(shopCart,(int)itemIds.get(i));
        }
        return shopCart;
    }

    @Override
    public ShopCart updateShopSption(ShopCart shopCart) {
        // 获取购物选项列表
        List<ShopOption> shopOptions = shopCart.getShopOptions();
        // 拷贝原购物车中的购物选项列表
        List<ShopOption> copyShopOptions = new ArrayList<>();
        // 初始化选中的购物选项的数量
        shopOptionCheckedNum = 0;
        shopOptions.forEach(s -> {
            // 拷贝原购物选项中的商品列表
            List<ItemOption> newItems = new ArrayList<>();
            // 初始化选中的商品的数量
            itemCheckedNum = 0;
            s.getItems().forEach(i -> {
                Item item = itemDao.findById(i.getItem().getId(),true);
                // 如果商品的购买数量大于商品的库存，就将购买数量改成库存的最大值
                if (i.getShopNum() > item.getNum()) {
                    i.setShopNum(item.getNum());
                    newItems.add(i);
                }else {
                    newItems.add(i);
                }
                // 如果商品的复选框被选中，则选中数量加1
                if (i.getIsChecked()) {
                    itemCheckedNum++;
                }
            });
            s.setItems(newItems);
            // 如果商品被全部选中，则将该购物选项复选框的状态置为true
            if (itemCheckedNum == s.getItems().size()) {
                s.setIsChecked(true);
            }
            // 如果购物选项的复选框被选中，则选中数量加1
            if (s.getIsChecked() == true) {
                shopOptionCheckedNum ++;
            }
            copyShopOptions.add(s);
        });
        // 如果购物选项被全部选中，则将该购物车的全选状态置为true
        if (shopOptionCheckedNum == shopCart.getShopOptions().size()) {
            shopCart.setIsChecked(true);
        }
        shopCart.setShopOptions(copyShopOptions);
        return shopCart;
    }
}
